abscissa 0.0.6

Application microframework with support for command-line option parsing, configuration, error handling, logging, and shell interactions
Documentation

Abscissa

Crate Docs Apache 2.0 Licensed Build Status Appveyor Status

Abscissa is a microframework for building Rust applications (either CLI tools or network/web services), aiming to provide a large number of features with a minimal number of dependencies, and with a strong focus on security.

Documentation

Features

  • command-line option parsing: simple declarative option parser based on (i.e. forked from) gumdrop. The option parser in Abcissa contains numerous improvements which provide better UX and tighter integration with the other parts of the framework (e.g. overriding configuration settings using command-line options).
  • configuration: declarative global configuration support using an RwLock on a lazy_static. Simple parsing of TOML configurations to serde-parsed global structures which can be dynamically updated at runtime.
  • error handling: generic Error type based on the failure crate, and a unified error-handling subsystem.
  • logging: uses the log and simplelog crates to automatically configure application-level logging, presently to standard output or files.
  • secrets management: the (optional) secrets module includes a Secret type which derives serde's Deserialize and can be used to represent secret values parsed from configuration files or elsewhere (e.g. credentials loaded from the environment or network requests)
  • shell interactions: support for colored terminal output (with color support autodetection). Useful for Cargo-like status messages with easy-to-use macros.

Depencencies

or: "Know Your Dependencies"

One of Abscissa's primary goals is to maximize functionality while minimizing the number of dependencies. Abscissa is used in a number of high-security contexts, and as such we view each additional dependency as additional attack surface and therefore a potential liability. We have therefore been very conscientious about the dependencies we use and will not add additional dependencies without due consideration.

Here are all of Abscissa's transitive dependencies:

# Crate Name Origin License unsafe? Description
1 abscissa iqlusion Apache-2.0 yes App microframework
2 backtrace @alexcrichton MIT/Apache-2.0 yes Capture stack traces
3 backtrace-sys @alexcrichton MIT/Apache-2.0 yes Capture stack traces
4 byteorder @BurntSushi MIT/Unlicense yes Convert endianness
5 canonical-path iqlusion Apache-2.0 yes Get canonical fs paths
6 chrono chronotope MIT/Apache-2.0 yes Time/date library
7 failure @withoutboats MIT/Apache-2.0 yes Error handling
8 isatty @dtolnay MIT/Apache-2.0 yes Are stdout/stderr TTYs?
9 lazy_static rust-lang MIT/Apache-2.0 yes Heap-allocated statics
10 libc rust-lang MIT/Apache-2.0 yes C library wrapper
11 log rust-lang MIT/Apache-2.0 yes Logging facade library
12 num-integer rust-num MIT/Apache-2.0 yes Integer trait
13 num-traits rust-num MIT/Apache-2.0 yes Numeric traits
14 redox_syscall redox-os MIT yes Redox OS syscall API
15 rustc_demangle @alexcrichton MIT/Apache-2.0 yes Symbol demangling
16 semver @steveklabnik MIT/Apache-2.0 yes Semantic versioning
17 semver-parser @steveklabnik MIT/Apache-2.0 no† Parser for semver spec
18 serde serde-rs MIT/Apache-2.0 yes Serialization framework
19 simplelog @drakulix MIT/Apache-2.0 yes Simple logging facility
20 term @Stebalien MIT/Apache-2.0 yes‡ Terminal color support
21 time rust-lang MIT/Apache-2.0 yes Time/date library
22 toml @alexcrichton MIT/Apache-2.0 no TOML parser library
23 winapi§ @retep998 MIT/Apache-2.0 yes Windows API bindings
24 zeroize iqlusion Apache-2.0 yes Zero out sensitive data
  • semver-parser has one usage of unsafe which is not compiled by Abscissa.
  • term has one usage of unsafe on Windows. Other platforms do not use unsafe.
  • § winapi also pulls in either winapi-i686-pc-windows-gnu or winapi-x86_64-pc-windows-gnu which are omitted for brevity.

Build / Development Dependencies

# Crate Name Origin License unsafe? Description
1 abscissa_derive iqlusion Apache-2.0 yes Abscissa custom derive
2 cc @alexcrichton MIT/Apache-2.0 yes C/C++ compiler wrapper
3 cfg-if @alexcrichton MIT/Apache-2.0 no If-like #[cfg] macros
4 failure_derive @withoutboats MIT/Apache-2.0 yes failure custom derive
5 proc-macro2 @alexcrichton MIT/Apache-2.0 yes Shim for Macros 2.0 API
6 quote @dtolnay MIT/Apache-2.0 no Rust AST to token macro
7 serde_derive serde-rs MIT/Apache-2.0 no serde custom derive
8 syn @dtolnay MIT/Apache-2.0 yes Rust source code parser
9 synstructure @mystor MIT/Apache-2.0 no syn structure macros
10 unicode-xid unicode-rs MIT/Apache-2.0 no Identify valid Unicode
11 version_check @SergioBenitez MIT/Apache-2.0 no rustc feature detection

Dependency Relationships

The table below should help answer questions as to why a particular crate is an Abscissa dependency and whether or not it is optional. Abscissa uses cargo features to allow parts of it you aren't using to be easily disabled, so you only compile the parts you need.

Crate Name Cargo Features Platform Required By
abscissa mandatory - -
abscissa_derive mandatory - abscissa
backtrace mandatory - failure
backtrace-sys mandatory - backtrace
byteorder shell - term
canonical-path mandatory - abscissa
cc mandatory - backtrace-sys, zeroize
cfg-if mandatory - backtrace
chrono logging - simplelog
failure mandatory - abscissa
failure_derive mandatory - failure
isatty shell - abscissa
lazy_static mandatory - abscissa
libc shell unix isatty
log logging - abscissa
num-integer logging - chrono
num-traits logging - chrono, num-integer
proc-macro2 mandatory - abscissa_derive, failure_derive, quote, serde_derive
redox_syscall shell redox isatty
rustc_demangle mandatory - backtrace
semver application - abscissa
semver-parser application - abscissa
serde config - abscissa
serde_derive config - serde
simplelog logging - abscissa
term shell - abscissa
time logging - chrono
unicode-xid mandatory - proc-macro2
version_check mandatory - lazy_static
winapi§ shell windows isatty
zeroize mandatory - abscissa

Frequently Asked Questions (FAQ)

Q1: Why is it called "abscissa"?

A1: An abscissa represents the elevation of a point above the y-axis. In that regard, "Abscissa" can be thought of as a pun about getting off the ground, or elevating your project.

The word "abscissa" is also the key to the Kryptos K2 panel.

License

The abscissa crate is distributed under the terms of the Apache License (Version 2.0).

Copyright © 2018 iqlusion

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Parts of this code were taken from the following projects, which have agreed to license their code under the Apache License (Version 2.0):